package main

import (
    "asset-management-go/config"
    "asset-management-go/router"
    "context"
    "errors"
    "log"
    "net/http"
    "os"
    "os/signal"
    "time"
)

func main() {
    config.InitConfig()

    r := router.SetupRouter()

    // 判断配置文件端口号非空
    port := config.Appconfig.App.Port
    if port == "" {
        port = ":3000"
    }

    // 优雅退出
    // 创建一个http服务器实例
    srv := &http.Server{
        Addr:    port,
        Handler: r,
    }

    // 启动服务器，并且监听
    go func() {
        // 有错误，并且不为关闭服务器
        if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
            log.Fatalf("listen: %s\n", err)
        }
    }()

    // 声明一个缓冲区大小为1的通道，用于接收信号，这里会进入等待
    quit := make(chan os.Signal, 1)

    // 将系统的Ctrl + c信号传递到通道中
    signal.Notify(quit, os.Interrupt)
    <-quit

    // 接收到信号，输出
    log.Println("Shutdown Server ...")

    // 创建一个带有5秒超时，并且可以取消的上下文
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)

    // 延迟调用，确保上下文被取消，释放资源
    defer cancel()

    // shutdown方法关闭服务器，等待当前服务器所有请求执行完成，关闭服务器，可以一直等待，受限于上下文的超时时间
    if err := srv.Shutdown(ctx); err != nil {
        log.Fatal("Server Shutdown:", err)
    }
    log.Println("Server exiting")

}
